#include <stdio.h>

int *getInt() {
    int a = 100;

    return &a; // 返回栈区变量的地址是错误的
}

char *getString1() {
    char str[] = "Hello World!";

    return str;
}

char *getString2() {
    char *str = "Hello World!";

    return str;
}

// 为什么上述相似的代码会有不同的执行结果?
// getString2 返回的是字符串常量 "Hello World1" 的地址
// 字符串常量存储在常量区里, 所以不同的地方能够输出正确的 "Hello World!"

// getString1 返回的是局部变量 str 的地址, 所以不同地方输出是错误的

// char str[] = "Hello World!" 等效与下面的代码, str 属于局部变量
// char str[13];
// strcpy(str, "Hello World!");


void test01() {
    printf("int = %d", *getInt());
    // 结果不重要, 此时对栈内存操作就就是非法操作(因为栈区的内存已经释放, 操作的属于内存泄露)
}

void test02() {
    printf("string = %s\n", getString1());
    printf("string = %s\n", getString2());
}

int main() {
    // test01();

    test02();
}

// 栈区注意事项: 不要返回局部变量的地址, 局部变量在函数体执行完成之后会被释放,
// 在次操作就是非法操作, 结果未知